<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      //常量: 不变的量
      //PI是常量
      // let a = 10;
      // a = 20;
      // a = 30;
      // console.log(a);

      //1.常量一旦被声明 那么不能被重复声明且不能被重新赋值
      // const a = 10;
      // const a = 20; //报错
      // a = 20;
      // console.log(a); //报错

      //2.没有声明前置 有暂时性死区
      // console.log(a);
      // const a = 10; //报错

      //3.不会挂载在window上
      // const a = 10;
      // console.log(window.a); //undefined

      //4.支持块作用域
      // {
      //   const a = 10;
      // }
      // console.log(a); //报错

      // {
      //   const a = 10;
      //   console.log(a);
      // }
      // 注意: const 定义复杂数据类型
      // const obj = {
      //   myname: "张三",
      //   age: 20,
      // };
      // // obj = {
      // //   myname: "李四",
      // //   age: 40,
      // // }; //重新赋值对象  报错

      // obj.myname = "李四"; //只冻结了外面一层 里面没有冻结 可以修改
      // console.log(obj);

      // const obj = {
      //   myname: "张三",
      //   age: 20,
      // };
      // Object.freeze(obj); //冻结操作
      // obj.myname = "李四";
      // console.log(obj);

      //深冻结
      // const obj = {
      //   myname: "张三",
      //   age: 20,
      //   hobby: {
      //     one: "篮球",
      //   },
      // };

      // Object.freeze(obj); //只能冻结一层
      // obj.hobby.one = "足球"; //还是可以修改
      // console.log(obj);

      //s
      //
      //
      const obj = {
        myname: "张三",
        age: 20,
        hobby: {
          one: "篮球",
        },
      };
      //
      deepFreeze(obj);
      function deepFreeze(obj) {
        Object.freeze(obj); //把hobby取出来冻结  myname和age是简单数据类型  hobby是复杂数据类型  用for in循环
        for (var key in obj) {
          if (obj.hasOwnProperty(key)) {
            //判断是不是自身属性 hasOwnProperty
            if (typeof obj[key] === "object") {
              // console.log(obj[key]); //输出one篮球
              deepFreeze(obj[key]); //然后再调用函数 把one篮球传进去
            }
          }
        }
      }
      obj.hobby.one = "足球";
      console.log(obj); //被冻结了  里面也无法修改  还是篮球
    </script>
  </body>
</html>
